package commons.jdbc.basic;


import java.sql.*;
import java.util.*;

public  class JDBCUtil {
	//数据对象
	private  static    String DIVER;
	private  static    String URL;
	private  static    String ROOT;
	private  static    String PSD;
	//对象
	private   Connection  connection;//连接池
	private PreparedStatement  preparedStatement;
	//结果
	private   ResultSet   resultSet;
	private  int  resultRows;

	public   boolean isAutoCommit=true;

	/**
	 * 获得链接对象
	 * @return
	 */
	public Connection getConnection(){
		try {
			if(connection==null  ||  connection.isClosed()){
				connection= DruidConnectionFactory.openConnection();
			}
		} catch (SQLException e) {
			System.out.println("数据库链接失败,账号或者密码或者数据库地址错误");
		}
		return connection;
	}
	/**
	 * 获得操作对象
	 * @param sql
	 * @return
	 */
	public Statement  getStatement(String  sql){
		try {
			getConnection();
			preparedStatement=connection.prepareStatement(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return  preparedStatement;

	}

	/*  admin
	 * 	adminId  adminName
	 *  1         韩梅梅
	 *  2    李磊
	 *  List<Map<String,Object>>
	 *    map={adminId=1;  adminName=韩梅梅}
	 *    map={adminId=2;  adminName=李磊}
	 *
	 */
	/**
	 * 把结果集转换为  List<Map<String,Object>>   list每一个元素是表的一行数据  每一个map保存该 字段名字以及值
	 * @param sql
	 * @param parameters
	 * @return
	 */
	public  List<Map<String,Object>>  query(String  sql,Object...parameters){//object []  obj
		//申明一个集合 保存表的信息
		List<Map<String,Object>>  list=new Vector<Map<String,Object>>();
		try {
			//查看执行对象是否存在和被关闭
			if(preparedStatement==null ||  preparedStatement.isClosed()){
				getStatement(sql);
			}
			//填入参数
			if(parameters!=null){
				for (int i = 0; i < parameters.length; i++) {
					preparedStatement.setObject(i+1, parameters[i]);
				}
			}
			//执行 并获得结果
			resultSet=preparedStatement.executeQuery();
			//总共有多少列?  列数是固定的
			ResultSetMetaData   resultSetMetaData=	resultSet.getMetaData();//保存的每一列的信息 (列头信息)
			//获得总列数
			int  count=resultSetMetaData.getColumnCount();//7
			//要把resultSet  里面的结果提取成  List<map>
			if(resultSet!=null){
				while(resultSet.next()){//有一行数据  就是一行 Map
					Map<String,Object>   column_value=new HashMap<>();
					//列明可以获得列值
					for(int  i=1;i<=count;i++){
						//每一列的列的名字
						String  columnName=resultSetMetaData.getColumnLabel(i);//resultSet.getObject(i);
						//利用列明获得列值
						Object  columnValue=resultSet.getObject(columnName);
						//把数据库的字段全转换为小写
						column_value.put(columnName.toLowerCase(), columnValue);
					}
					list.add(column_value);//每一行数据添加到集合中
				}
			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			close();//可以释放  原因在于 已经把集合转为 List
		}

		return  list;
	}
	/**
	 * 更新
	 * @param sql
	 * @param objs
	 * @return
	 */
	public  int   update(String sql,Object...objs){//insert
		try {
			if(preparedStatement==null || preparedStatement.isClosed()){
				getStatement(sql);
			}
			//执行之前传入占位的参数
			if(objs!=null){//这个sql有占位符
				for (int i=0;i<objs.length;i++) {
					preparedStatement.setObject(i+1, objs[i]);
				}
			}
			//修改   insert  update   delete
			resultRows=preparedStatement.executeUpdate();//2
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			close();
		}
		return		resultRows;
		//4.释放资源
	}


	public  void  close(){
		//
		if(resultSet!=null){
			try {
				resultSet.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(preparedStatement!=null){
			try {
				preparedStatement.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(connection!=null){
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
